<?php
/**
 * Here is your custom functions.
 */

use plugin\admin\app\model\Admin;
use plugin\admin\app\model\AdminRole;

/**
 * 当前管理员id
 * @return integer|null
 */
function admin_id(): ?int
{
    return session('admin.id');
}

/**
 * 当前管理员
 * @param null|array|string $fields
 * @return array|mixed|null
 * @throws Exception
 */
function admin($fields = null)
{
    refresh_admin_session();
    if (!$admin = session('admin')) {
        return null;
    }
    if ($fields === null) {
        return $admin;
    }
    if (is_array($fields)) {
        $results = [];
        foreach ($fields as $field) {
            $results[$field] = $admin[$field] ?? null;
        }
        return $results;
    }
    return $admin[$fields] ?? null;
}

/**
 * 刷新当前管理员session
 * @param bool $force
 * @return void
 * @throws Exception
 */
function refresh_admin_session(bool $force = false)
{
    $admin_session = session('admin');
    if (!$admin_session) {
        return null;
    }
    $admin_id = $admin_session['id'];
    $time_now = time();
    // session在2秒内不刷新
    $session_ttl = 2;
    $session_last_update_time = session('admin.session_last_update_time', 0);
    if (!$force && $time_now - $session_last_update_time < $session_ttl) {
        return null;
    }
    $session = request()->session();
    $admin = Admin::find($admin_id);
    if (!$admin) {
        $session->forget('admin');
        return null;
    }
    $admin = $admin->toArray();
    $admin['password'] = md5($admin['password']);
    $admin_session['password'] = $admin_session['password'] ?? '';
    if ($admin['password'] != $admin_session['password']) {
        $session->forget('admin');
        return null;
    }
    // 账户被禁用
    if ($admin['status'] != 0) {
        $session->forget('admin');
        return;
    }
    $admin['roles'] = AdminRole::where('admin_id', $admin_id)->pluck('role_id')->toArray();
    $admin['session_last_update_time'] = $time_now;
    $session->set('admin', $admin);
}


/**
 * 执行插入
 *
 * @param array $data
 * @return mixed|null
 */
function doInsert(array $data,$model)
{
    $primary_key = $model->getKeyName();
    $model_class = get_class($model);
    $model = new $model_class;
    foreach ($data as $key => $val) {
        $model->{$key} = $val;
    }
    $model->save();
    return $primary_key ? $model->$primary_key : null;
}

/**
 * 执行更新
 *
 * @param array $data
 * @return void
 */
function doUpdate(array $data,$model_info)
{
    foreach ($data as $key => $val) {
        $model_info->{$key} = $val;
    }
    $model_info->save();
}

/**
 * 用于测试打印数组数据
 *
 * @param mixed $arr
 **/
function p($arr)
{
    header('content-type:text/html;charset=utf-8');
    echo '<pre>';
    print_r($arr);
    echo '</pre>';
}

/**
 * 返回JSON统一格式
 *
 * @param int $code 返回状态 0成功 1失败
 * @param string $msg
 * @param array $data
 * @return array
 */
function V($code, $msg, $data = [])
{
    return array('code' => $code, 'msg' => $msg, 'data' => $data);
}

/**
 * 获取订单号
 *
 * @param integer $user_id
 * @return string
 **/
function get_order_sn($user_id = 1)
{
    $rand = $user_id < 9999 ? mt_rand(100000, 99999999) : mt_rand(100, 9999);
    $order_sn = date('Ymdhis') . $rand;
    $id = str_pad($user_id, (24 - strlen($order_sn)), '0', STR_PAD_BOTH);
    return $order_sn . $id;
}

/**
 * 一维数组转为二维数组
 *
 * @param array $arr
 * @param string $str1
 * @param string $str2
 * @return array
 */
function get_one_two_array($arr, $str1, $str2)
{
    $item = [];
    foreach ($arr as $k => $v) {
        $item[] = [
            $str1 => $k,
            $str2 => $v,
        ];
    }
    return $item;
}

/**
 * 判断是否为端口号 (0-65535)
 *
 * @param string $input
 * @return bool
 **/
function checkPortOrIp($input) {
    // 端口号：通常是0-65535之间的整数。
    // IP地址：可以是IPv4或IPv6格式。
    // 判断是否为端口号 (0-65535)
    if (is_numeric($input)) {
        $port = (int)$input;
        if ($port >= 0 && $port <= 65535) {
            return true;
        }
    }

//    // 判断是否为IPv4地址
//    if (filter_var($input, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
//        return 'ipv4';
//    }
//
//    // 判断是否为IPv6地址
//    if (filter_var($input, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
//        return 'ipv6';
//    }

    return false;
}

/**
 * 处理换行
 *
 * @param string $subject
 * @return array
 **/
function getLineBreak($subject){
    // 使用 preg_split 可以处理不同操作系统下的换行符(\n, \r\n, \r)
    $data = preg_split('/\r\n|\r|\n/', $subject);
    $data = getLineEmpty($data);
    return $data;
}

/**
 * 处理空行
 *
 * @param array $input
 * @return array
 **/
function getLineEmpty($input){
    // 过滤空行
    $data = array_filter($input, function ($item) {
        return trim($item) !== '';
    });
    return $data;
}

